Learn Next.js チュートリアルのサインアウトボタンで AWS Amplify のサインアウト機能を実行する

Learn Next.js チュートリアルのサインアウトボタンで AWS Amplify のサインアウト機能を実行する

Clock Icon2024.10.12

いわさです。

最近 AWS Amplify を使って Web アプリケーションを作成しているのですが、使ってもらっている同僚から「サインアウト機能がほしい」という指摘をもらいました。
Next.js のダッシュボードテンプレートをベースに作成しており、元々はサインアウトボタンがサイドメニューに存在していたのですが、認証あるいはクッキーが関連するだろうということで Amplify での実装をとりあえず後回しにしていました。

DF470971-9078-41A0-A92A-7F7CDEA19452.png

ただ、Amplify のサインアウト機能は非常に簡単に実装することが出来ます。
Amplify UI を使ってサインイン/サインアップ画面を実装することが多いと思いますが、その場合は次のように Authenticator から取得出来る sighOut を使うことも出来ます。

https://dev.classmethod.jp/articles/add-signout-process-when-using-authenticator-component-of-amplify-ui/

ただ、今回のサンプルだとサイドバーを実装しコンポーネントも分割されていたため同じように実装すべきか悩みました。

2B0AED62-308E-4253-9F94-B9E58A317A9E.png

sighOut API

Gen1 も Gen2 も同じなのですが、aws-amplify/authsighOutを使うことが出来ます。

https://docs.amplify.aws/gen1/react/build-a-backend/auth/enable-sign-up/#sign-out

どこからでも呼び出すことができ、さらにオプションでグローバルサインアウトを実行することも出来ます。
Cognito のグローバルサインアウトの場合はユーザーに発行した ID トークン、アクセストークン、リフレッシュトークンを無効化します。

https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_GlobalSignOut.html

サインアウトボタンを設置して、クリック時に sighOut を実行するようにします。

app/ui/dashboard/sidenav.tsx
import Image from "next/image"
import NavLinks from '@/app/ui/dashboard/nav-links';
import { ArrowRightStartOnRectangleIcon } from '@heroicons/react/24/outline';
import { signOut } from "aws-amplify/auth"

export default function SideNav() {
  async function handleSighOut() {
    await signOut();
  }
  return (
    <div className="flex h-full flex-col px-3 py-4 md:px-2">
      <Image src="/logo_black_600.png" width={400} height={200} alt="logo_black_600.png" />
      <div className="flex grow flex-row justify-between space-x-2 md:flex-col md:space-x-0 md:space-y-2">
        <NavLinks />
        <div className="hidden h-auto w-full grow rounded-md bg-gray-50 md:block"></div>
        <form>
          <button
            className="flex h-[48px] w-full grow items-center justify-center gap-2 rounded-md bg-gray-50 p-3 text-sm font-medium hover:bg-sky-100 hover:text-blue-600 md:flex-none md:justify-start md:p-2 md:px-3"
            onClick={handleSighOut}>
            <ArrowRightStartOnRectangleIcon className="w-6" />
            <div className="hidden md:block">Sign Out</div>
          </button>
        </form>
      </div>
    </div>
  );
}

アイコンはサンプルで使っていた heroicons から適当なものを探してきました。

https://heroicons.com/

サイドメニューにサインアウトボタンを設置出来ました。

7F2F2AC3-4909-4251-B5A3-584A53260D66.png

ボタンを押してみるとサインアウトされ、サインイン画面が表示されるようになりました。良さそうです。

54D529EC-F5FF-4883-AF2F-E9802D492A06.png

さいごに

本日は Learn Next.js チュートリアルのサインアウトボタンで AWS Amplify のサインアウト機能を実行してみました。

Auth(Cognito)のグローバルサインアウトが簡単に呼び出せて良いですね。
Amplify を使っている方はおそらく当たり前のように使っていそうですが、以外に Atuhenticator を使った利用が多かったので最初少し悩みました。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.